package org.carl.code.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ReflectUtil;
import org.carl.code.Generate;

import java.io.File;
import java.lang.reflect.Constructor;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Administrator
 */
public class GenerateUtil {
    private GenerateUtil() {
    }

    /**
     * 生成目标文件
     *
     * @param file       源文件
     * @param targetFile 目标文件
     * @throws Exception
     */
    public static void generate(File file, File targetFile) throws Exception {
        if (file.isDirectory()) {
            if (!targetFile.exists()) {
                FileUtil.mkdir(targetFile);
                Console.log("正在处理目录:{}至目标目录:{}", file.toString(), targetFile.toString());
            }
        } else {
            Set<Class<?>> classes = ClassUtil.scanPackageBySuper("org.carl.code.ext", Generate.class);
            Map<String, Class<?>> classesMap = classes.stream().collect(Collectors.toMap(c -> FileNameUtil.extName(c.getName()).toLowerCase(), a -> a));
            String ext = FileNameUtil.extName(file).toLowerCase();
            if (classesMap.containsKey(ext)) {
                Class<?> aClass = classesMap.get(ext);
                Constructor<?> constructor = ReflectUtil.getConstructor(aClass, File.class, File.class);
                Generate generate = (Generate) constructor.newInstance(file, targetFile);
                generate.generate();
            } else {
                //统一处理
                FileUtil.copy(file, targetFile, true);
            }
            Console.log("正在处理文件:{}至目标文件:{}", file.toString(), targetFile.toString());
        }
    }
}
